在鐵人賽一開始的時候
花了一些時間介紹 EC2 的 user-data
在 EC2 初始化的時候建立一些基礎設定
在第八天的時候介紹 Systems Manager
可以對於 EC2 有更多的操作
不過對於佈署到 EC2 的 Application
仍有個尚未解決的問題
那就是 Log 的轉發
縱使 Application 層可以設定 Log 的 Rotation
但是這樣仍無法達到 Cloud Native 的精神
昨天我們介紹的 CloudWatch 就可以將服務轉成 CloudNative
只要在 EC2 中安裝 Agent
並將 Log 轉發到 CloudWatch Log 中
這樣從服務到 Log 的監控完全就在雲端中
要將 Log 轉發到 CloudWatch Log 中
必要條件就是需要在 EC2 中裝 Agent
並對於要轉發的 Log 做一些設定
就可以將 Log 轉發
Amazon 所提供的作業系統 Amazon Linux 2
可以直接下指定進行安裝
sudo yum install amazon-cloudwatch-agent
其他的作業系統則需要另外從 S3 上下載進行安裝
下載 CloudWatch 代理程式。針對 Linux 伺服器,請輸入以下資訊。對於 download-link,請使用上表中適當的下載連結。
wget download-link
針對執行 Windows Server 的伺服器,請下載以下檔案:https://amazoncloudwatch-agent.s3.amazonaws.com/windows/amd64/latest/amazon-cloudwatch-agent.msi
下載套件之後,您可以選擇驗證套件簽章。如需更多詳細資訊,請參閱 驗證 CloudWatch 代理程式套件的簽章。
安裝套件。若您在 Linux 伺服器上下載了 RPM 套件,請變更到包含該套件的目錄,然後輸入以下資訊:sudo rpm -U ./amazon-cloudwatch-agent.rpm
若您在 Linux 伺服器上下載了 DEB 套件,請變更到包含該套件的目錄,然後輸入以下資訊:sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
若您在執行 Windows Server 的伺服器上下載了 MSI 套件,請變更到包含該套件的目錄,然後輸入以下資訊:msiexec /i amazon-cloudwatch-agent.msi
雖然也可以使用 IAM User
但是 AWS 比較建議 EC2 所使用的 IAM Role 去賦予相關權限操作
而不是另外建立 IAM User 和 Credentials 去增加維護成本
IAM Role 需要 Attach 這個 Policy CloudWatchAgentServerRole
驗證完簽章和安裝完 CloudWatch 代理程式以後
先使用 Wizard 建立 CloudWatch Agent 設定檔
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
在執行 Windows Server 的伺服器上,執行下列命令來啟動精靈:
cd "C:\Program Files\Amazon\AmazonCloudWatchAgent"
.\amazon-cloudwatch-agent-config-wizard.exe
使用 Wizard 建立完成後的設定檔會是個 json 檔
需要將這個 json 檔的路徑記錄起來啟動程式的時候需要用到
在執行 Linux 的 EC2 執行個體上,輸入以下命令:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:configuration-file-path
在執行 Windows Server 的 EC2 執行個體上,從 PowerShell 主控台輸入以下內容:
& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -s -c file:configuration-file-path
記得將 configuration-file-path 替換成自己的檔案路徑
如果使用的作業系統是 Amazon Linux 2
那產生的 config.json 預計位於 /opt/aws/amazon-cloudwatch-agent/bin/config.json
對於 metrics 要傳送的資訊大家可以再翻找官方文件
裡面會有指標設定的相關說明
{
"agent": {
"metrics_collection_interval": 1,
"run_as_user": "CWAgent"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "Log 在 EC2上的路徑",
"log_group_name": "填寫 Log Group 的名稱",
"log_stream_name": "填寫Stream Name",
"retention_in_days": 90
},
]
}
}
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 0
},
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
"metrics_collection_interval": 1,
"resources": [
"*"
],
"totalcpu": false
},
"disk": {
"measurement": [
"used_percent",
"inodes_free"
],
"metrics_collection_interval": 1,
"resources": [
"*"
]
},
"diskio": {
"measurement": [
"io_time",
"write_bytes",
"read_bytes",
"writes",
"reads"
],
"metrics_collection_interval": 1,
"resources": [
"*"
]
},
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 1
},
"netstat": {
"measurement": [
"tcp_established",
"tcp_time_wait"
],
"metrics_collection_interval": 1
},
"statsd": {
"metrics_aggregation_interval": 0,
"metrics_collection_interval": 10,
"service_address": ":8125"
},
"swap": {
"measurement": [
"swap_used_percent"
],
"metrics_collection_interval": 1
}
}
}
}
參考資料: